961
18363
그래서 저는 당신이 일을 할 시간이있는 소셜 게임을 개발하고 있습니다. 소셜이므로 다른 플레이어와 채팅 할 수 있습니다.
채팅 메시지를받을 때마다 알림도 받게되며이를 클릭하면 그와의 채팅 화면으로 리디렉션됩니다. 지금은 잘 작동합니다.
내가 원하지 않는 것은 사용자가 실제로 PlayActivity에서 플레이하는 동안 채팅 알림을 수신한다는 것입니다.
이미 표시된 알림이 PlayActivity에있는 동안 나중에 무시되거나 일시 중단 될 수 있다면 좋을 것입니다.
이것이 가능합니까?
다른 접근 방식은 이미 표시된 모든 알림을 취소하고 BroadcastReceiver를 절전 모드로 전환하고 PlayActivity가 완료된 후 모든 알림과 BroadcastReceiver를 부활시키는 것입니다.
가능하지 않습니까?
적어도 활동을 떠나기 전에 앱이 물어볼 수 있습니까? 그런 식으로 경고하고 그가 여전히 떠나면 게임은 그에 대해 가치가있을 수 있습니다.
지금 내가하는 일은 해결 방법 일뿐입니다 .PlayActivity를 전체 화면으로 만들고 포커스가 변경되었는지 확인합니다. 상태 표시 줄 / 알림 영역을 아래로 드래그하는 경우. 하지만 이것은 단지 해킹 일뿐입니다. 제가 정말로 없애고 싶은 일입니다.
보시다시피 올바른 접근 방식이 무엇인지 잘 모르겠습니다. 프로 Android 소프트웨어 개발자는 제 경우에 무엇을하나요?
미리 감사드립니다!
지금은 BroadcastReceiver를 확장하여 알림을 처리하고 있습니다. 코드가 끝에 추가됩니다. 내 코드의 다른 부분이 필요하면 알려주세요!
공용 클래스 PushBroadcastReceiver는 BroadcastReceiver를 확장합니다.
{
@우세하다
public void onReceive (컨텍스트 컨텍스트, 의도 의도)
{
시험
{
JSONObject json =
새로운 JSONObject (
intent.getExtras ()
.getString ( "KEY"));
알림 (컨텍스트, 의도, json);
}
catch (JSONException e)
{
L.debug (App.TAG, "JSONException :"+ e.getMessage ());
}
}
private void notify (Context ctx, Intent i, JSONObject dataObject) throws JSONException
{
NotificationManager nm = (NotificationManager)
ctx.getSystemService (Context.NOTIFICATION_SERVICE);
부울 createNotification = false;
PendingIntent pi = null;
int gameId = 0;
// 채팅
if (dataObject.getString ( "KEY_CHAT"). equals ( "VALUE_CHAT")) {
의도 의도 = new Intent (ctx, ChatActivity.class);
intent.putExtra ( "opponentUsername", dataObject.getString (PARSE_JSON_OPPONENT_USERNAME_KEY));
intent.putExtra ( "gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, 의도, PendingIntent.FLAG_UPDATE_CURRENT);
gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
createNotification = true;
// 게임
} else if (dataObject.getString ( "KEY_GAME"). equals ( "VALUE_GAME")) {
의도 의도 = new Intent (ctx, SS6RunningGameActivity.class);
intent.putExtra ( "gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, 의도, PendingIntent.FLAG_UPDATE_CURRENT);
createNotification = true;
}
if (createNotification) {
Uri 사운드 = Uri.parse ( "android.resource : //"
+ ctx.getPackageName () + "/"+ R.raw.push_notif);
int 아이콘 = R.drawable.icon_notification_android;
문자열 tickerText =
dataObject.getString ( "TEXT");
알림 mNotification = new NotificationCompat.Builder (ctx)
.setContentTitle (ctx.getResources (). getString (R.string.app_name))
.setContentText (tickerText)
.setSmallIcon (icon)
.setContentIntent (pi)
.setSound (sound)
.setDefaults (Notification.DEFAULT_VIBRATE)
.setAutoCancel (true)
.setStyle (new NotificationCompat.BigTextStyle ()
.bigText (tickerText))
.짓다();
nm.notify (gameId, mNotification);
}
} 
이에 대한 많은 접근 방식이있을 수 있습니다.
가장 간단한 방법은 다음과 같습니다.
SharedPreferences를 사용하십시오. PlayActivity가 현재 실행 중임을 나타내는 부울 값을 추가합니다.
PlayActivity의 onCreate (Bundle)에서 다음을 수행하십시오.
// 초기화
SharedPreferences preferences = getSharedPreferences ( "MY_PREF_FILE_NAME", 0);
편집자 편집 = preferences.edit ();
// 여기서 "PLAY_ACTIVITY_IS_RUNNING"은 '키'이고 'true'는 값입니다.
//`PlayActivity`가 실행 중임을 말합니다.
edit.putBoolean ( "PLAY_ACTIVITY_IS_RUNNING", true);
edit.commit ();
이제 PlayActivity의 onPause ()에서이 부울을 false로 설정하여 PlayActivity를 종료 할 것임을 나타냅니다.
// 초기화
SharedPreferences preferences = getSharedPreferences ( "MY_PREF_FILE_NAME", 0);
편집자 편집 = preferences.edit ();
// 여기서 "PLAY_ACTIVITY_IS_RUNNING"은 '키'이고 'false'는 값입니다.
// 'PlayActivity'가 더 이상 실행되지 않는다는 의미입니다.
edit.putBoolean ( "PLAY_ACTIVITY_IS_RUNNING", false);
edit.commit ();
휴식은 아주 간단합니다.
PushBroadcastReceiver에서 SharedPreferences를 열고 PLAY_ACTIVITY_IS_RUNNING 키에 할당 된 값을 확인합니다. 이 값이 false이면 알림 게시를 계속합니다. 그렇지 않으면 나중에 수집 할 수 있습니다.
공용 클래스 PushBroadcastReceiver extends BroadcastReceiver {
@우세하다
public void onReceive (Context context, Intent intent) {
SharedPreferences 환경 설정 = context.getSharedPreferences (
"MY_PREF_FILE_NAME", 0);
// "PLAY_ACTIVITY_IS_RUNNING"키에 저장된 값을 검색합니다.
// 두 번째 인수 'false'는 기본값입니다.
// 키가 존재하지 않는 경우-논리적으로 건전합니다
부울 playActivityIsRunning = preferences.getBoolean (
"PLAY_ACTIVITY_IS_RUNNING", false)
// PlayActivity가 실행 중입니다.
if (playActivityIsRunning) {
// JSON 객체를 어딘가에 저장하고 나중에 처리합니다.
} else {
{
JSONObject json = new JSONObject (intent.getExtras (). getString ( "KEY"));
알림 (컨텍스트, 의도, json);
} catch (JSONException e) {
L.debug (App.TAG, "JSONException :"+ e.getMessage ());
}
}
}
private void notify (Context ctx, Intent i, JSONObject dataObject) throws JSONException {
....
....
}
}
보류중인 알림을 게시 할 방법을 찾아야합니다. 이에 대한 한 가지 해결책은 PlayActivity의 onPause ()에서 별도의 브로드 캐스트를 다른 BroadcastReceiver로 보내는 것입니다. 그러나 이것은 사용자가 방향을 변경할 때에도 onPause ()가 호출되기 때문에 문제가 될 수 있습니다. 아마도이 BroadcastReceiver는 1 초 지연 후 작동을 시작할 수 있습니까? 이것은 활동이 다시 생성되는 데 충분한 시간이며 PLAY_ACTIVITY_IS_RUNNING 재설정 값이 다시 설정됩니다 (PlayActivity의 onCreate (Bundle)가 다시 호출되기 때문).
따라서 흐름은 다음과 같습니다.
onPause가 호출됩니다.
SharedPreferences에서 값을 false로 설정하십시오.
보류중인 알림을 처리하기 위해 브로드 캐스트를 보냅니다.
Runnable 안에 BroadcastReceiver의 코드를 넣으십시오. 핸들러를 사용하여 1 초 지연된이 Runnable을 게시합니다.
BroadcastReciever 내부 => SharedPreferences에서 PLAY_ACTIVITY_IS_RUNNING의 값을 확인 <= 1 초 후에 수행됩니다. 사용자가 화면 방향 만 변경 한 경우 PLAY_ACTIVITY_IS_RUNNING 값은 true가됩니다. 그렇지 않고 사용자가 PlayActivity에서 벗어나면 값은 false가됩니다.
7
|
너의 답
StackExchange.ifUsing ( "editor", function () {
StackExchange.using ( "externalEditor", function () {
StackExchange.using ( "snippets", function () {
StackExchange.snippets.init ();
});
});
}, "코드 스 니펫");
StackExchange.ready (function () {
var channelOptions = {
태그 : "".split ( ""),
id : "1"
};
initTagRenderer ( "". split ( ""), "".split ( ""), channelOptions);
StackExchange.using ( "externalEditor", function () {
// 스 니펫이 활성화 된 경우 스 니펫 후에 편집기를 실행해야합니다.
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ( "snippets", function () {
createEditor ();
});
}
else {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor : false,
heartbeatType : '답변',
autoActivateHeartbeat : false,
convertImagesToLinks : true,
noModals : true,
showLowRepImageUploadWarning : true,
scoreToPostImages : 10,
bindNavPrevention : true,
접미사 : "",
imageUploader : {
brandingHtml : "Powered by \ u003ca href = \"https : //imgur.com/ \ "\ u003e \ u003csvg class = \"svg-icon \ "width = \"50 \ "height = \"18 \ "viewBox = \ "0 0 50 18 \"fill = \ "none \"xmlns = \ "http : //www.w3.org/2000/svg \"\ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.6931182C47.4335 4.61182 46.7256 4.52513.6307884.65959531 43.5251. 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \"M32.492 10.1419C32.492 12.6954 34.1182 14.048437.0451 14.0484C39.9723 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.25.4696 11.562455 37.0451 11.5455C36.521 4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \"evenodd \ "clip-rule = \"evenodd \ "d = \"M25.6622 17.6335 C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C27.499 4.86533 26.7932 C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.4373 27.2502 15.2321 25.777 15.2321 349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 24.9072 17.6335 25.694324978.09727ZM24.1.317 9.27932668.0932. C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \"M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.879 11.9512V9.38535 19.8079 11.9512V9.3298 13.8962 19.8079 12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.9466 5.5079C7.58314 4.9300 7.106649V11. 9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10. 893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4044 13.8962C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.911e \ u "/7.58817 16.8000345 8.8045 \ u17 16.8045 d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.31675 13.2535 3.31675 11.9512V6.59049Z \ \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \"fill = \ "# 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml : "\ u003ca href = \"https : //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \"https://stackoverflow.com에 따라 라이선스가 부여 된 사용자 기여 / legal / content-policy \ "\ u003e (콘텐츠 정책) \ u003c / a \ u003e",
allowUrls : true
},
onDemand : true,
폐기 선택기 : ".discard-answer"
, immediatelyShowMarkdownHelp : true, enableTables : true, enableSnippets : true
});
}
});
Stack Overflow에 대한 답변에 기여해 주셔서 감사합니다!
질문에 반드시 답해주십시오. 세부 사항을 제공하고 연구를 공유하십시오!
그러나 피하십시오…
도움, 설명을 요청하거나 다른 답변에 응답합니다.
의견에 근거한 진술 작성 참고 자료 또는 개인적인 경험으로 백업하십시오.
자세한 내용은 훌륭한 답변 작성에 대한 팁을 참조하십시오.
초안이 저장되었습니다.
초안이 삭제되었습니다.
가입 또는 로그인
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ( '# login-link');
});
Google을 사용하여 가입
Facebook을 사용하여 가입
이메일 및 비밀번호를 사용하여 가입
제출
게스트로 게시
이름
이메일
필수이지만 표시되지 않음
StackExchange.ready (
함수 () {
StackExchange.openid.initPostLogin ( '. new-post-login', 'https % 3a % 2f % 2fstackoverflow.com % 2fquestions % 2f25114521 % 2fis-it-possible-to-suspend-already-shown-and-new-notifications- for-an-amount-of % 23new-answer ','question_page ');
}
);
게스트로 게시
이름
이메일
필수이지만 표시되지 않음
답변 게시
포기
"답변 게시"를 클릭하면 서비스 약관, 개인 정보 보호 정책 및 쿠키 정책에 동의하게됩니다.
찾고있는 답변이 아닙니까? Android 알림 푸시 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하세요.